package cn.wolfcode.web.interceptor;

import cn.wolfcode.domain.Employee;
import cn.wolfcode.util.RequirePermission;
import cn.wolfcode.util.UserContext;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;

@Component
public class CheckPermissionInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        // 如果handler 是HandlerMethod 实例, 就是动态访问
        if (handler instanceof HandlerMethod) {

            // 获取员工对象 =>通过工具类从session中获取
            Employee employee = UserContext.getEmployee();
            // 1. 判断是否是管理员
            if (employee.isAdmin()) {
                return true; // 是管理员 放行
            }
            // 不是管理员 => 2. 是否贴有权限注解
            HandlerMethod handlerMethod = (HandlerMethod) handler; // 拿到处理方法对象
            // 拿到注解对象
            RequirePermission annotation = handlerMethod.getMethodAnnotation(RequirePermission.class);
            // 没有注解=> 没有设置权限 任何人都可以访问 放行
            if (annotation == null) {
                return true;
            }
            // 有注解 => 3. 判断员工是否拥有权限
            // 获取访问方法的权限表达式
            String expression = annotation.expression();
            // 从会话域中获取员工 权限 => 避免没有权限时,刷新页面,反复对服务器发送请求
            List<String> expressions = UserContext.getExpressions();
            // 员工拥有该权限 => 放行
            if (expressions.contains(expression)) {
                return true;
            }
            // 不是管理员 方法贴了权限 员工没有该权限 =>解决没有权限访问页面空白问题
            response.sendRedirect("/nopermission");
        }
        return false;
    }
}
